perm filename QUADS.SAI[PUB,TES] blob
sn#215396 filedate 1976-05-08 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00011 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGOF("QUADS")
C00003 00003 PUBLIC SIMPLE PROCEDURE QUADS! $"#
C00004 00004 PUBLIC RECURSIVE PROCEDURE BOUND(INTEGER KIND) $"#
C00011 00005 PUBLIC SIMPLE PROCEDURE DINDENT $"#
C00012 00006 PUBLIC SIMPLE PROCEDURE DSUPERIMPOSE $"#
C00013 00007 PUBLIC SIMPLE PROCEDURE DTABS $"#
C00015 00008 PUBLIC SIMPLE PROCEDURE SCRIPT(INTEGER ARROW) $"#
C00017 00009 PUBLIC RECURSIVE PROCEDURE TABTO(INTEGER POSNO) $"#
C00018 00010 PUBLIC SIMPLE PROCEDURE UNSCRIPT(INTEGER ARROW) $"#
C00021 00011 FINISHED
C00022 ENDMK
C⊗;
BEGOF("QUADS")
COMMENT
Tabs, somescripts, infinity, superimpose, flush left, flush right,
and center. Also the INDENT declaration.
;
PROCEDURES
PUBLIC SIMPLE PROCEDURE QUADS! ;$"#
BEGIN "QUADS!"
TABSORT[1]←TWO(33);
END "QUADS!" ;
PUBLIC RECURSIVE PROCEDURE BOUND(INTEGER KIND) ;$"#
PLK: THIS ENTIRE PROCEDURE REWORKED 6-FEB-75
THE INFORMATION PASSED TO PASS2 FOR ∞ STRINGS AND → AND ← IS
(1) WHERE WE WANT TO BE
(2) WHERE WE ARE
(3) 1 OR 2 ( WE LIED IN THE FIRST CASE IF IT WAS CENTERING)
(4) XLENGTH OF THE ∞ STRING (ONLY IN XCRIBL MODE)
(5) THE ∞ STRING
;
IF ON THEN
BEGIN "BOUND"
STRING FILLER,SEGMENT,BOUNDS;
SIMPLE PROCEDURE TABCASE(INTEGER RB);
BEGIN "TABCASE"
INTEGER LB;
RB←RB*CHARW;
LB←(IF XCRIBL THEN XLBP ELSE LBP) + LMARG*CHARW - (LBFAKE-OLBFAKE);
BOUNDS ← CVSR(RB) & CVSR(LB) & CVSR(1);
SEGMENT←NULL;
FILLER ← LBF;
APPEND(FONTCHAR & "→") ; APPEND (BOUNDS);
IF XCRIBL THEN APPEND(CVSR(XLENGTH(FILLER)));
APPEND(FILLER & ALTMODE);
APPEND(FONTCHAR & "←");
END "TABCASE";
COMMENT
KIND ≤ 0 ... ∞X (THE ASCII OF X NEGATED)
= 1 ... ←
= 2 ... →
= 3 ... CR OR BREAK
= 4 ... TAB (\ OR ∂) ;
IF KIND=3 OR (KIND=4 AND NULSTR(LBF)) THEN
SPCS←0
ELSE EMIT(NULL);
OKCR(TRUE) ; COMMENT ADDED 4/17/72 ;
COMMENT AN EARLIER BOUND ON THIS LINE MAY HAVE SET LBK←KIND ;
IF LBK < 3 THEN
CASE (LBK MAX 0) OF
BEGIN "BY KIND"
[0] COMMENT ∞ ONLY VALID IF IMMEDIATELY PRECEDING THIS BOUND ;
IF (LBO < OAKS) OR (SPCS>0) THEN
BEGIN "SHOULD NOT HAVE MOVED"
WARN("=","∞ NEEDS A RIGHT BOUND") ;
LBF ← NULL ;
END ;
[1] COMMENT CENTER BETWEEN LEFT BOUND AT POSN=LBP AND THIS TAB TO RBOUND, OR BETWEEN MARGINS ;
BEGIN "CENTER"
INTEGER LB,RB,FAKEL,MINL,LASTPOSN;
FAKEL←FAKE-LBFAKE;
LASTPOSN←(IF XCRIBL THEN XLBP ELSE LBP) + LMARG*CHARW;
MINL←(IF XCRIBL THEN (XPOSN-XLBP) ELSE (POSN-LBP))-FAKEL;
RB ← (IF KIND=4 THEN ((RBOUND+LMARG)*CHARW+LASTPOSN) ELSE ((RMARG+LMARG)*CHARW)) - MINL;
LB ← LASTPOSN - (LBFAKE-OLBFAKE);
BOUNDS←CVSR(RB) & CVSR(LB) & CVSR(2); PLK: MUST DIVIDE BY 2 IN PASS2
TO PREVENT TRUCATION FROM HAPPENING TWICE;
SEGMENT ← OWL[LBO+1 TO OAKS] ; COPY(SEGMENT) ; OAKS ← LBO ; FILLER ← OLBF ;
APPEND(FONTCHAR & "→") ; APPEND(BOUNDS) ;
IF XCRIBL THEN APPEND(CVSR(XLENGTH(FILLER)));
APPEND(FILLER & ALTMODE);
APPEND(SEGMENT) ; APPEND(FONTCHAR & "←") ;
POSN ← ((RB DIV CHARW) + FAKEL) DIV 2 + MINL;
XPOSN ← (RB + FAKEL) DIV 2 + MINL;
LBFAKE←LBFAKE + ((FAKEL-1) DIV 2); plk: so that OLBFAKE will be right the next time
in the event of an ∞ string;
END "CENTER" ;
[2] COMMENT → RIGHT FLUSH AGAINST TAB TO RBOUND OR AGAINST RIGHT MARGIN ;
BEGIN "RIGHT FLUSH"
INTEGER RB,LB;
RB ← (IF KIND=4 THEN (RBOUND+LMARG)*CHARW ELSE RMARG*CHARW) -
(IF XCRIBL THEN (XPOSN-XLBP) ELSE (POSN-LBP)) +
(FAKE-LBFAKE);
LB←(IF XCRIBL THEN XLBP ELSE LBP) + LMARG*CHARW - (LBFAKE-OLBFAKE);
BOUNDS←CVSR(RB) & CVSR(LB) & CVSR(1);
SEGMENT ← OWL[LBO+1 TO OAKS] ; COPY(SEGMENT) ; OAKS ← LBO ; FILLER ← OLBF ;
APPEND(FONTCHAR & "→") ; APPEND(BOUNDS) ;
IF XCRIBL THEN APPEND(CVSR(XLENGTH(FILLER)));
APPEND(FILLER & ALTMODE);
APPEND(SEGMENT) ; APPEND(FONTCHAR & "←") ;
POSN ← RB DIV CHARW;
XPOSN ← RB;
END "RIGHT FLUSH"
END "BY KIND";
IF KIND=3 AND FULSTR(LBF) THEN TABCASE(RMARG);
IF KIND=4 THEN
BEGIN "TAB"
IF FULSTR(LBF) THEN TABCASE(RBOUND+LMARG)
ELSE APPEND(FONTCHAR&"="&CVSR(CHARW*(RBOUND+LMARG)));
BRKXPOSN←BRKXPOSN+FSHORT; FSHORT←0;
POSN ← RBOUND ; XPOSN ← RBOUND * CHARW ;
END "TAB" ;
IF KIND = 4 AND POSN > MAXIM THEN MAXIM ← NMAXIM+LMARG
ELSE IF FILL THEN MAXIM ← IF KIND LEQ 2 THEN NMAXIM ELSE FMAXIM ;
IF KIND = 3 THEN XLBP ← LBP ← LBO ← LBFAKE ← OLBFAKE ← 0 RKJ: 1-22-74;
ELSE
BEGIN "SETUP FOR NEXT TIME"
COMMENT FINALLY, SET LEFT BOUND FOR A SUBSEQUENT BOUND ;
LBO ← OAKS ; LBP ← POSN ; XLBP ← XPOSN ;
LBK ← KIND ; MIDWORD ← FALSE ;
IF KIND LEQ 0 THEN
BEGIN LBF←LBF&(-KIND); RETURN END; plk: cannot reset the LBxx if we
are only making the ∞ string longer;
OLBFAKE ← LBFAKE ; LBFAKE ← FAKE ;
plk: (leq 0) and 3 have been eliminated by now;
IF KIND=4 THEN OLBF←LBF←NULL
ELSE BEGIN OLBF←LBF; LBF←NULL; END;
END "SETUP FOR NEXT TIME";
END "BOUND" ;
PUBLIC SIMPLE PROCEDURE DINDENT ;$"#
BEGIN
STRING X ;
DBREAK ; PASS ; X ← E(NULL,NULL) ; IF ON AND FULSTR(X) THEN FIRSTIM ← CVD(X) ;
IF ITSCH(<,>) THEN BEGIN PASS ; X←E(NULL, NULL) END ELSE X←NULL ;
IF ON AND FULSTR(X) THEN RESTIM←CVD(X) ;
IF ITSCH(<,>) THEN BEGIN PASS ; X←E(NULL, NULL) END ELSE X←NULL ;
IF ON AND FULSTR(X) THEN RIGHTIM←CVD(X) ;
END "DINDENT" ;
PUBLIC SIMPLE PROCEDURE DSUPERIMPOSE ;$"#
BEGIN
INTEGER N ;
DBREAK ; PASS ; N ← CVD(E("0",NULL)) MIN 50 ;IF N<1 THEN N←50 ; IF NOT ON THEN RETURN ;
TWEENLFM ← N-1; SINCELFM ← 0; BREAKM ← 5;
END "DSUPERIMPOSE" ;
PUBLIC SIMPLE PROCEDURE DTABS ;$"#
BEGIN TES 8/26/74 REWROTE FOR ASCEND-CHECK AND "ONLY" OPTION ;
INTEGER NUMB, I, BIG ;
BIG ← 0 ;
FOR I ← 1 THRU TABLIMIT DO
BEGIN
PASS ; NUMB ← CVD(E("-9999", NULL)) MIN 9999 ;
IF ON THEN
IF NUMB LEQ BIG THEN
BEGIN
WARN(NULL, <"TAB STOPS " & CVS(BIG) & "," & CVS(NUMB) & " ARE OUT OF ORDER">) ;
I ← I - 1 ;
END
ELSE TABSORT[I] ← BIG ← NUMB ;
IF NOT ITSCH(<,>) THEN BEGIN I ← I + 1 ; DONE END ;
END ;
IF ON AND I > TABLIMIT THEN WARN(NULL,"Too many Tab Stops") ;
NUMB ← IF ITS(ONLY) THEN IPASS(TWO(34)) TES 8/26/73 FOR BRIAN HARVEY ;
ELSE TWO(33) ;
IF ON THEN TABSORT[I] ← NUMB ;
END "DTABS" ;
PUBLIC SIMPLE PROCEDURE SCRIPT(INTEGER ARROW) ;$"#
BEGIN
INTEGER CHR ;
CHR ← LOP(INPUTSTR) ;
HEIGHT ← HEIGHT + (IF ARROW="↑" THEN 1 ELSE -1) ;
ABOVEX ← ABOVEX MAX HEIGHT ; BELOWX ← BELOWX MIN HEIGHT ;
IF POSN LEQ MAXIM OR XCRIBL THEN
BEGIN EMIT(NULL);
APPEND(FONTCHAR&ARROW);
IFC SAILVER THENC COMMENT RHT 5/7/76;
IF DSCRIPTM AND XCRIBL THEN APPEND(FONTCHAR&ARROW);
ENDC
END ;
RIPTPOSNS ← RIPTPOSNS LSH 9 LOR (POSN+LMARG) ;
IF LDB(SPCODE(CHR))=LBRACK THEN BEGIN SUPERSUB ← SUPERSUB LSH 9 LOR ARROW ;
AMPPOSN ← AMPPOSN LSH 9 ; COMMENT 3/28/72 ; END
ELSE BEGIN EMIT(CHR) ; UNSCRIPT(ARROW) END ;
END "SCRIPT" ;
PUBLIC RECURSIVE PROCEDURE TABTO(INTEGER POSNO) ;$"#
IF ON THEN
BEGIN TES 8/14/74 SIMPLIFIED AND FIXED A BUG ;
POSNO ← POSNO MAX 1-LMARG ; TES 8/11/74 ;
IF (IF XCRIBL THEN (POSNO*CHARW LEQ XPOSN) ELSE (POSNO LEQ POSN)) THEN
IF FULSTR(LBF) THEN
BEGIN
WARN("=","Already passed tab column " & CVS(POSNO)) ;
RETURN ;
END
ELSE TABI ← 0
ELSE IF POSNO>NMAXIM+LMARG THEN
BEGIN
WARN("BAD TAB",<"Can't TAB past right margin to char "&CVS(POSNO)&
(IF FILL THEN CRLF&"Did you really mean to be in FILL mode?" ELSE NULL)>) ;
RETURN
END ;
RBOUND ← POSNO-1 ;
BOUND(4) ;
END "TABTO" ;
PUBLIC SIMPLE PROCEDURE UNSCRIPT(INTEGER ARROW) ;$"#
BEGIN
INTEGER CHR, PN ; BOOLEAN MORE, WILLRIPT ;
IFCR SAILVER THENC comment RHT 4/22/76;
SIMPLE INTEGER PROCEDURE XPADJ(INTEGER I);
RETURN(IF XCRIBL THEN I*CHARW ELSE I);
ELSEC
DEFINE XPADJ(I) = [I];
ENDC
IF ARROW = 0 THEN
BEGIN COMMENT "]" -- find matching "[" ;
ARROW ← SUPERSUB LAND '177 ;
AMPPOSN ← AMPPOSN LSH -9 ; COMMENT 3/28/72 ;
SUPERSUB ← SUPERSUB LSH -9 ;
END ;
IF POSN LEQ MAXIM OR XCRIBL THEN
BEGIN
EMIT(NULL) ;
IF ARROW NEQ "." THEN
BEGIN
APPEND(FONTCHAR & ("↑"+"↓" - ARROW)) ;
IFC SAILVER THENC COMMENT RHT 5/7/76;
IF DSCRIPTM AND XCRIBL THEN APPEND(FONTCHAR&("↑"+"↓"-ARROW));
ENDC
HEIGHT ← HEIGHT - (IF ARROW="↑" THEN 1 ELSE -1) ;
END ;
END ;
WILLRIPT ← TRUE ; comment assume that RIPTPOSNS will be updated by SCRIPT if necessary ;
IF LDB(SPCODE(INPUTSTR)) = AMSAND THEN
BEGIN
LOPP(INPUTSTR) ;
MORE ← TRUE ; PN ← RIPTPOSNS LAND '177 - LMARG ; COMMENT 3/28/72: ;
AMPPOSN ← ((AMPPOSN LSH -9) LSH 9) LOR ((AMPPOSN LAND '177) MAX POSN) ;
IF PN<POSN THEN BEGIN APPEND(FONTCHAR&"-"&CVSR(XPADJ(POSN-PN))); POSN←PN END ;
IF (CHR ← LDB(SPCODE(INPUTSTR))) = LBRACK THEN
BEGIN
SUPERSUB ← SUPERSUB LSH 9 LOR "." ;
LOPP(INPUTSTR) ; WILLRIPT ← FALSE ; comment not a ript: won't call SCRIPT! ;
END
ELSE IF CHR NEQ UARROW AND CHR NEQ DARROW THEN BEGIN EMIT(LOP(INPUTSTR)) ; MORE ← FALSE END ;
END
ELSE MORE ← FALSE ;
IF NOT MORE THEN BEGIN COMMENT 3/28/72: ;
PN ← (AMPPOSN LAND '177) MAX POSN ; AMPPOSN ← (AMPPOSN LSH -9) LSH 9 ;
IF PN>POSN THEN BEGIN APPEND(FONTCHAR&"+"&CVSR(XPADJ(PN-POSN))) ; POSN←PN END END ;
IF WILLRIPT THEN RIPTPOSNS ← RIPTPOSNS LSH -9 ;
END "UNSCRIPT" ;
FINISHED
ENDOF("QUADS")